/**
 * @file yuv3.c
 * @author your name (you@domain.com)
 * @brief YUV420P像素数据 去掉颜色（u和v）
 * @version 0.1
 * @date 2021-04-27
 * 
 * @copyright Copyright (c) 2021
 * 
 */
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int simplest_yuv420_gray(char * url, int w, int h, int num);

int main(void)
{
    simplest_yuv420_gray("../resource/sintel_640_360.yuv", 640, 360, 100);
    return 0;
}

int simplest_yuv420_gray(char * url, int w, int h, int num)
{
    FILE * fp = fopen(url, "rb+");
    if(fp == NULL) {
        printf("fopen failed[%s] \n", strerror(errno));
        return -1;
    }
    FILE *fp1 = fopen("output_gray.yuv", "wb+"); 

    uint8_t * pic = (uint8_t *)malloc(w * h * 3 / 2);

    for (int i = 0; i < num; i++)
    {
        fread(pic, 1, w * h * 3 / 2, fp);

        memset(pic + w * h, 255, w * h / 2); /* 这里修改的是U V 的值，其中的128 是灰度值，也可以选择 0 或 255 */
        fwrite(pic, 1, w * h * 3 / 2, fp1);
    }

    free(pic);
    fclose(fp);
    fclose(fp1);   

    return 0;
}


/****
 * 如果想把YUV格式像素数据变成灰度图像，只需要将U、V分量设置成128即可。这是因为U、V是图像中的经过偏置处理的色度分量。
 * 色度分量在偏置处理前的取值范围是-128至127，这时候的无色对应的是“0”值。
 * 经过偏置后色度分量取值变成了0至255，因而此时的无色对应的就是128了。
 * 
 * 这里的 偏置处理 是啥意思？
 * ****/